home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Franz PD
/
Franz PD Disk #225 (1993)(Rhein-Sieg-Soft).zip
/
Franz PD Disk #225 (1993)(Rhein-Sieg-Soft).adf
/
AMOSCopy
/
AMOSCopyV1_1a.AMOS
/
AMOSCopyV1_1a.amosSourceCode
next >
Wrap
AMOS Source Code
|
1993-03-05
|
32KB
|
1,429 lines
'* ***************************************** *
'* Program: AMOSCopy *
'* Version: 1.1a *
'* Copyright: �1993 by Testaware *
'* ----------------------------------------- *
'* Author: Volker Stepprath *
'* Spandauerstr.4 *
'* 4019 / Monheim *
'* Germany *
'* ----------------------------------------- *
'* Language: AMOS V1.31 *
'* Compiler: ACmp V1.0 *
'* Copyright: �1991 by Europress Software *
'* ----------------------------------------- *
'* History: 1.0a / 1.0b / 1.1a *
'* ----------------------------------------- *
'* Last update: New Option `RIPPER` / ABOUT *
'* removed ! *
'* ----------------------------------------- *
'* Call: WorkBench or CLI *
'* ----------------------------------------- *
'* Programnote: Shareware ( Read DOC file ) *
'* ***************************************** *
'
'
'**** Variablen definieren ****
Dim UPP(79),LOW(79)
Global SOURCE,TARGET,VERIFY,ABORT,UPP,LOW,_DOIT
Global UPP(),LOW(),XUPP,YUPP,XLOW,YLOW,UPPSIDE,LOWSIDE,RIP$
SOURCE=0 : TARGET=1 : VERIFY=1 : OPTION=1 : UPPSIDE=1 : LOWSIDE=1
For I=0 To 79
UPP(I)=1
LOW(I)=1
Next I
'
Unpack 16 To 0
Colour Back $779
Change Mouse 4
'Erase 1
'Erase 16
'Break Off
Request Off
Close Workbench
Set Dir 30,""
Get Block 1,13,190,224,8
_MESSAGE[""]
Amos To Front
'
'**** Speicher f�r Blockdaten reservieren ****
Reserve As Chip Data 7,1024
'
'**** Hauptschleife ( Men�abfrage ) ****
Do
UPP=0 : LOW=0 : _DOIT=0 : XUPP=True : YUPP=0 : XLOW=True : YLOW=0 : ABORT=0
Wait 15 : Clear Key
Repeat : Until Mouse Key=0
Repeat : MK=Mouse Key : Until MK
XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse)
'
'**** SOURCE & TARGET festlegen ****
If XM>30 and XM<67
Ink 4,5
If YM>35 and YM<71
If MK=1
Add SOURCE,1,0 To 3
Else
Add SOURCE,-1,0 To 3
End If
Text 44,53,Str$(SOURCE)-" "
End If
If YM>81 and YM<117
If MK=1
Add TARGET,1,0 To 3
Else
Add TARGET,-1,0 To 3
End If
Text 44,99,Str$(TARGET)-" "
End If
End If
'
'**** Disketteseiten modifizieren *****
If XM>82 and XM<184 and YM>57 and YM<156
_UPPERSIDE[XM,YM]
End If
If XM>200 and XM<302 and YM>57 and YM<156
_LOWERSIDE[XM,YM]
End If
'
'**** Verify ON / OFF ****
If XM>37 and XM<71 and YM>147 and YM<157
If VERIFY
VERIFY=0
G[38,148,51,158,0]
G[53,148,70,158,1]
Else
VERIFY=1
G[38,148,51,158,1]
G[53,148,70,158,0]
End If
End If
'
'**** Option festlegen ****
If XM>9 and XM<309 and YM>161 and YM<186
For I=0 To 6
G[10+I*43,162,50+I*43,172,0]
G[10+I*43,175,50+I*43,185,0]
Next I
Add XM,-9
XM=XM/43
If YM>161 and YM<173
OPTION=XM+1
G[10+XM*43,162,50+XM*43,172,1]
End If
If YM>174 and YM<186
OPTION=XM+8
G[10+XM*43,175,50+XM*43,185,1]
End If
End If
'
'**** Option starten ****
If XM>9 and XM<40 and YM>134 and YM<146
G[10,135,39,145,1]
_CLEARSIDE[-1]
_MESSAGE[""]
Gosub "O"+Str$(OPTION)-" "
G[10,135,39,145,0]
Play 1,30,25
End If
Loop
'
'**** DISKCopy ****
O1:
If SOURCE=TARGET Then _DISKCOPYII Else _DISKCOPY
Return
'**** Format ****
O2:
_TRACK[1]
If ABORT=0 Then _TRACKBLOCK[0,-1]
Return
'**** QFormat ****
O3:
N$="DF"+Str$(TARGET)-" "+":"
If Exist(N$)
Ink 1
_TRACKBLOCK[0,-1]
YUPP=0 : XUPP=0
_RASTER[0,0]
_TRACK[2]
YUPP=4 : XUPP=0
_RASTER[40,0]
Else
_MESSAGE["No DOS disk in targetdrive !"]
End If
Return
'**** Erase ****
O4:
_TRACK[3]
Return
'**** Check ****
O5:
_TRACK[4]
Return
'**** Install ****
O6:
_TRACKBLOCK[0,-1]
Return
'**** Block Edit ****
O7:
_MESSAGE["Blocknumber (0-1758):"]
_TEXTINPUT[23]
BLOCK=Val(N$)
BLOCK=Min(1758,BLOCK)
_EDITBLOCK[BLOCK]
If Not ABORT Then _MESSAGE[""]
Return
'**** Show RAW ****
O8:
_MESSAGE["Tracknumber (0-79):"]
_TEXTINPUT[21]
TRACK=Val(N$)
TRACK=Min(79,TRACK)
_RAWSHOW[TRACK]
If Not ABORT Then _MESSAGE[""]
Return
'**** Info ****
O9:
N$="DF"+Str$(TARGET)-" "+":"
If Exist(N$)
Dir$=N$
N$=Dir$
N$=N$-":"
N$=Left$(N$,11)
_MESSAGE[N$+" Free:"+Str$(Dfree)-" "+" Mem:"+Str$(Chip Free+Fast Free)-" "]
Else
_MESSAGE["No DOS disk in targetdrive !"]
End If
Return
'**** Dir ****
O10:
_DIR
Return
'**** SYS Check ****
O11:
_SYSCHECK
Return
'**** SYS Reset ****
O12:
_SYSRESET
Return
'**** Ripper ****
O13:
_RIPPER
Return
'**** Exit ****
O14:
Erase 7
Request On
If Exist("SYS:") Then Dir$="SYS:"
Wait 20
End
'System
Return
'
'**** Diskettenseiten + Seitenoptionen ****
Procedure _UPPERSIDE[XM,YM]
'
'**** UPPER Side BAM ****
If XM>82 and XM<183 and YM>57 and YM<146
Add XM,-83 : XM=XM/10
Add YM,-58 : YM=YM/11
TRACK=YM*10+XM
If UPP(TRACK)
UPP(TRACK)=0
G[83+XM*10,58+YM*11,92+XM*10,68+YM*11,0]
Else
UPP(TRACK)=1
G[83+XM*10,58+YM*11,92+XM*10,68+YM*11,1]
End If
End If
'
If YM>146 and YM<156
'
'**** UPP On ****
If XM>83 and XM<95
G[83,147,96,155,1]
G[98,147,115,155,0]
UPPSIDE=1
End If
'
'**** UPP Off ****
If XM>97 and XM<116
G[83,147,96,155,0]
G[98,147,115,155,1]
UPPSIDE=0
End If
'
'**** UPP Reverse ****
If XM>117 and XM<150
G[117,147,149,155,1]
For I=0 To 79
If UPP(I)
UPP(I)=0
Else
UPP(I)=1
End If
Next I
For I=0 To 7
For I2=0 To 9
G[83+I2*10,58+I*11,92+I2*10,68+I*11,UPP(I3)]
Add I3,1
Next I2
Next I
I3=0
G[117,147,149,155,0]
End If
'
'**** UPP Default ****
If XM>150 and XM<183
G[151,147,182,155,1]
_CLEARSIDE[0]
For I=0 To 7
For I2=0 To 9
UPP(I3)=1
G[83+I2*10,58+I*11,92+I2*10,68+I*11,UPP(I3)]
Add I3,1
Next I2
Next I
I3=0
UPPSIDE=1
G[83,147,96,155,1]
G[98,147,115,155,0]
G[151,147,182,155,0]
End If
End If
End Proc
Procedure _LOWERSIDE[XM,YM]
'
'**** LOWER Side BAM ****
If XM>200 and XM<301 and YM>57 and YM<146
Add XM,-201 : XM=XM/10
Add YM,-58 : YM=YM/11
TRACK=YM*10+XM
If LOW(TRACK)
LOW(TRACK)=0
G[201+XM*10,58+YM*11,210+XM*10,68+YM*11,0]
Else
LOW(TRACK)=1
G[201+XM*10,58+YM*11,210+XM*10,68+YM*11,1]
End If
End If
If YM>146 and YM<156
'
'**** LOW On ****
If XM>201 and XM<215
G[201,147,214,155,1]
G[216,147,233,155,0]
LOWSIDE=1
End If
'
'**** LOW Off ****
If XM>215 and XM<234
G[201,147,214,155,0]
G[216,147,233,155,1]
LOWSIDE=0
End If
'
'**** LOW Reverse ****
If XM>235 and XM<268
G[235,147,267,155,1]
For I=0 To 79
If LOW(I)
LOW(I)=0
Else
LOW(I)=1
End If
Next I
For I=0 To 7
For I2=0 To 9
G[201+I2*10,58+I*11,210+I2*10,68+I*11,LOW(I3)]
Add I3,1
Next I2
Next I
I3=0
G[235,147,267,155,0]
End If
'
'**** LOW Default ****
If XM>268 and XM<301
G[269,147,300,155,1]
_CLEARSIDE[1]
For I=0 To 7
For I2=0 To 9
LOW(I3)=1
G[201+I2*10,58+I*11,210+I2*10,68+I*11,LOW(I3)]
Add I3,1
Next I2
Next I
I3=0
LOWSIDE=1
G[201,147,214,155,1]
G[216,147,233,155,0]
G[269,147,300,155,0]
End If
End If
End Proc
Procedure _CLEARSIDE[N]
Ink 0
For I=0 To 7
For I2=0 To 9
If N=0 or N<0
Bar 84+I2*10,59+I*11 To 91+I2*10,67+I*11
End If
If N or N<0
Bar 202+I2*10,59+I*11 To 209+I2*10,67+I*11
End If
Next I2
Next I
End Proc
'**** Track kopieren ****
Procedure _DISKCOPY
'
Reserve As Chip Data 2,5632
'
'**** Variablen & Adressen definieren ****
DISKREP$=Space$(40)+Chr$(0)
DEVNAME$="trackdisk.device"+Chr$(0)
DISKREP=Varptr(DISKREP$)
'
IOREQ$=Space$(80)+Chr$(0)
IOREQADR=Varptr(IOREQ$)
'
IOREQ2$=Space$(80)+Chr$(0)
IOREQADR2=Varptr(IOREQ2$)
'
'**** Eigene Taskadresse suchen ****
Areg(0)=0
Areg(1)=0
Dreg(0)=0
Dreg(1)=0
XFINDTASK=Execall(-294)
Loke DISKREP+$10,XFINDTASK
'
'**** Device �ffnen I & II ****
Areg(0)=Varptr(DEVNAME$)
'
Areg(1)=IOREQADR
Dreg(0)=SOURCE
XOPENDEVICE=Execall(-444)
If XOPENDEVICE<>0 Then _MESSAGE["Sourcedrive not available !"] : Goto _BYE
'
Areg(1)=IOREQADR2
Dreg(0)=TARGET
XOPENDEVICE=Execall(-444)
If XOPENDEVICE<>0 Then _MESSAGE["Targetdrive not available !"] : Goto _BYE
'
'**** Befehl aufrufen ****
Loke IOREQADR+14,DISKREP
Loke IOREQADR+40,Start(2)
Loke IOREQADR+36,5632
Doke IOREQADR+28,2
'
Loke IOREQADR2+14,DISKREP
Loke IOREQADR2+40,Start(2)
Loke IOREQADR2+36,5632
Doke IOREQADR2+28,11
'
Gosub _DISKCOPY
'
'**** Motor ausschalten I & II ****
Areg(1)=IOREQADR
Doke IOREQADR+28,9
Loke IOREQADR+36,0
XDOIO=Execall(-456)
Areg(1)=IOREQADR2
Doke IOREQADR2+28,9
Loke IOREQADR2+36,0
XDOIO=Execall(-456)
'
'**** Device schlie�en I & II ****
Areg(1)=IOREQADR
XCLOSEDEVICE=Execall(-450)
Areg(1)=IOREQADR2
XCLOSEDEVICE=Execall(-450)
'
_BYE:
Erase 2
Pop Proc
'
_DISKCOPY:
UL=-1
'
For TRACK=0 To 159
Add UL,1,0 To 1
_BAMCHECK[UL]
If _DOIT
'
'**** Track einlesen ****
Ink 1,0
Areg(1)=IOREQADR
Loke IOREQADR+44,TRACK*5632
XDOIO=Execall(-456)
_LESETEST[TRACK,XDOIO]
'
'**** Track schreiben ****
Areg(1)=IOREQADR2
Loke IOREQADR2+40,Start(2)
Loke IOREQADR2+44,TRACK*5632
XDOIO=Execall(-456)
_RASTER[TRACK,XDOIO]
'
'**** Verify ****
If VERIFY and ABORT=0
Doke IOREQADR2+28,2
XDOIO=Execall(-456)
_VERIFY[TRACK,XDOIO]
Doke IOREQADR2+28,11
End If
End If
'
'**** Abbruch ? ****
If Mouse Key<>0
_ABORT
End If
If ABORT : TRACK=159 : End If
'
Next TRACK
Return
End Proc
Procedure _DISKCOPYII
If Fast Free+Chip Free<400000 Then _MESSAGE["Not enough memory !"] : Pop Proc
'
Reserve As Chip Data 2,225280
'
'**** Variablen & Adressen definieren ****
DISKREP$=Space$(40)+Chr$(0)
DEVNAME$="trackdisk.device"+Chr$(0)
DISKREP=Varptr(DISKREP$)
'
IOREQ$=Space$(80)+Chr$(0)
IOREQADR=Varptr(IOREQ$)
'
'**** Eigene Taskadresse suchen ****
Areg(0)=0
Areg(1)=0
Dreg(0)=0
Dreg(1)=0
XFINDTASK=Execall(-294)
Loke DISKREP+$10,XFINDTASK
'
'**** Device �ffnen I & II ****
Areg(0)=Varptr(DEVNAME$)
'
Areg(1)=IOREQADR
Dreg(0)=SOURCE
XOPENDEVICE=Execall(-444)
If XOPENDEVICE<>0 Then _MESSAGE["Sourcedrive not available !"] : Goto _BYE
'
'**** Befehl aufrufen ****
Loke IOREQADR+14,DISKREP
Loke IOREQADR+40,Start(2)
Loke IOREQADR+36,5632
'
Gosub _DISKCOPY
'
_ENDE:
'**** Motor ausschalten ****
Areg(1)=IOREQADR
Doke IOREQADR+28,9
Loke IOREQADR+36,0
XDOIO=Execall(-456)
'
'**** Device schlie�en ****
Areg(1)=IOREQADR
XCLOSEDEVICE=Execall(-450)
If Not ABORT Then _MESSAGE["Process finished !"]
'
_BYE:
Erase 2
Pop Proc
'
_DISKCOPY:
UL=True : UL2=True : N=True
'
For TRACK=0 To 3
If N
Clear Key : _MESSAGE["Insert sourcedisk and press any key"] : Wait Key
N=False : _MESSAGE[""]
End If
'
'**** Track einlesen ****
For I=0 To 39
Add UL,1,0 To 1
_BAMCHECK[UL]
If _DOIT
N=True
Ink 2,0
Areg(1)=IOREQADR
Doke IOREQADR+28,2
Loke IOREQADR+40,Start(2)+5632*I
Loke IOREQADR+44,5632*((TRACK*40)+I)
XDOIO=Execall(-456)
_RASTER[TRACK*40+I,XDOIO]
_LESETEST[TRACK*40+I,XDOIO]
'
'**** Abbruch ? ****
If Mouse Key<>0
_ABORT
End If
If ABORT : Goto _ENDE : End If
End If
Next I
'
If N
'**** Motor ausschalten ****
Areg(1)=IOREQADR
Doke IOREQADR+28,9
Loke IOREQADR+36,0
XDOIO=Execall(-456)
Loke IOREQADR+36,5632
'
Clear Key : _MESSAGE["Insert targetdisk and press any key"] : Wait Key
_MESSAGE[""] : Add UPP,-20 : Add LOW,-20 : Add YUPP,-2 : Add YLOW,-2
For I2=0 To 39
Add UL2,1,0 To 1
_BAMCHECK[UL2]
If _DOIT
Ink 1,0
'**** Track schreiben ****
Areg(1)=IOREQADR
Doke IOREQADR+28,11
Loke IOREQADR+40,Start(2)+5632*I2
Loke IOREQADR+44,5632*((TRACK*40)+I2)
XDOIO=Execall(-456)
If XDOIO=28 : _MESSAGE["Disk is write protected !"] : ABORT=True : Goto _ENDE : End If
_RASTER[TRACK*40+I2,XDOIO]
'
'**** VERIFY ****
If VERIFY and ABORT=0
Doke IOREQADR+28,2
XDOIO=Execall(-456)
_VERIFY[TRACK*40+I2,XDOIO]
End If
'
'**** Abbruch ? ****
If Mouse Key<>0
_ABORT
End If
If ABORT : Goto _ENDE : End If
End If
Next I2
End If
'
'**** Motor ausschalten ****
Areg(1)=IOREQADR
Doke IOREQADR+28,9
Loke IOREQADR+36,0
XDOIO=Execall(-456)
Loke IOREQADR+36,5632
'
Next TRACK
Return
End Proc
'**** Block Einlesen / Schreiben ****
Procedure _TRACKBLOCK[BLOCK,COMMAND]
'
'**** Variablen & Adressen definieren ****
DISKREP$=Space$(40)+Chr$(0)
DEVNAME$="trackdisk.device"+Chr$(0)
IOREQ$=Space$(80)+Chr$(0)
DISKREP=Varptr(DISKREP$)
IOREQADR=Varptr(IOREQ$)
'
'**** BootBlock erstellen ****
If COMMAND=-1
COMMAND=3
For I=0 To 1023
Poke Start(7)+I,0
Next I
For I=0 To 12
Read N
Loke Start(7)+I*4,N
Next I
End If
'
'**** Eigene Taskadresse suchen ****
Areg(0)=0
Areg(1)=0
Dreg(0)=0
Dreg(1)=0
XFINDTASK=Execall(-294)
Loke DISKREP+$10,XFINDTASK
'
'**** Device �ffnen ****
Areg(0)=Varptr(DEVNAME$)
Areg(1)=IOREQADR
Dreg(0)=TARGET
Dreg(1)=0
XOPENDEVICE=Execall(-444)
If XOPENDEVICE<>0 Then _MESSAGE["Targetdrive not available !"] : ABORT=True : Pop Proc
'
'**** Devicekommando ausf�hren ****
Loke IOREQADR+14,DISKREP
Doke IOREQADR+28,COMMAND
Loke IOREQADR+40,Start(7)
Loke IOREQADR+36,1024
Loke IOREQADR+44,BLOCK*512
XDOIO=Execall(-456)
If XDOIO=29 Then _MESSAGE["No disk in targetdrive !"] : ABORT=True
'
'**** UPDATE[4] falls COMMAND=WRITE[3] ****
If COMMAND=3
Doke IOREQADR+28,4
XDOIO=Execall(-456)
End If
'
'**** Motor ausschalten ****
Doke IOREQADR+28,9
Loke IOREQADR+36,0
XDOIO=Execall(-456)
'
'**** Device schlie�en ****
XCLOSEDEVICE=Execall(-450)
'
'**** BootBlockDaten ****
Data $444F5300,$C0200F19,$370,$43FA0018,$4EAEFFA0,$4A80670A
Data $20402068,$167000,$4E7570FF,$60FA646F,$732E6C69,$62726172,$79000000
End Proc
'**** Format / QFormat / Erase / Test ****
Procedure _TRACK[N]
'
Reserve As Chip Data 2,5632
'
'**** Variablen & Adressen definieren ****
DISKREP$=Space$(40)+Chr$(0)
DEVNAME$="trackdisk.device"+Chr$(0)
IOREQ$=Space$(80)+Chr$(0)
DISKREP=Varptr(DISKREP$)
IOREQADR=Varptr(IOREQ$)
'
'**** Eigene Taskadresse suchen ****
Areg(0)=0
Areg(1)=0
Dreg(0)=0
Dreg(1)=0
XFINDTASK=Execall(-294)
Loke DISKREP+$10,XFINDTASK
'
'**** Device �ffnen ****
Areg(0)=Varptr(DEVNAME$)
Areg(1)=IOREQADR
Dreg(0)=TARGET
Dreg(1)=0
XOPENDEVICE=Execall(-444)
If XOPENDEVICE<>0 Then _MESSAGE["Targetdrive not available !"] : Goto _BYE
'
'**** Befehl aufrufen ****
Loke IOREQADR+14,DISKREP
Loke IOREQADR+40,Start(2)
Loke IOREQADR+36,5632
Ink 1,0
On N Gosub _FORMAT,_QFORMAT,_ERASE,_TEST
'
'**** Motor ausschalten ****
Doke IOREQADR+28,9
Loke IOREQADR+36,0
XDOIO=Execall(-456)
'
'**** Device schlie�en ****
XCLOSEDEVICE=Execall(-450)
'
_BYE:
Erase 2
Pop Proc
'
'**** Track formattieren ****
_FORMAT:
Doke IOREQADR+28,11
UL=-1
For TRACK=0 To 159
Add UL,1,0 To 1
_BAMCHECK[UL]
If _DOIT
Loke IOREQADR+44,TRACK*5632
XDOIO=Execall(-456)
_RASTER[TRACK,XDOIO]
'
'**** Verify ****
If VERIFY and ABORT=0
Doke IOREQADR+28,2
XDOIO=Execall(-456)
_VERIFY[TRACK,XDOIO]
Doke IOREQADR+28,11
Ink 1
End If
End If
'
'**** Abbruch ? ****
If Mouse Key<>0
_ABORT
End If
If ABORT : TRACK=159 : End If
'
Next TRACK
If UPP(40) and ABORT=0
Gosub _QFORMAT
End If
Return
'
_QFORMAT:
Doke IOREQADR+28,11
N=Start(2)
For I=$204 To $2DF
Poke N+I,$FF
Next I
Doke N+2,$2
Poke N+15,$48
Loke N+20,$A661AEF3
Doke N+$13A,$1
Doke N+$13E,$371
Poke N+$1B0,$5
Poke N+$1B1,$45
Poke N+$1B2,$4D
Poke N+$1B3,$50
Poke N+$1B4,$54
Poke N+$1B5,$59
Poke N+$1FF,$1
Loke N+$200,$C000C037
Poke N+$272,$3F
Poke N+$2DC,$3F
Loke IOREQADR+44,$6E000
XDOIO=Execall(-456)
Return
'
_ERASE:
Doke IOREQADR+28,17
UL=-1
For TRACK=0 To 159
Add UL,1,0 To 1
_BAMCHECK[UL]
If _DOIT
Loke IOREQADR+44,TRACK
XDOIO=Execall(-456)
_RASTER[TRACK,XDOIO]
End If
'
'**** Abbruch ? ****
If Mouse Key<>0
_ABORT
End If
If ABORT : TRACK=159 : End If
'
Next TRACK
Return
'
'**** Track testen ****
_TEST:
Doke IOREQADR+28,2
UL=-1
For TRACK=0 To 159
Add UL,1,0 To 1
_BAMCHECK[UL]
If _DOIT
Loke IOREQADR+44,TRACK*5632
XDOIO=Execall(-456)
Ink 1
_RASTER[TRACK,XDOIO]
End If
'
'**** Abbruch ? ****
If Mouse Key<>0
_ABORT
End If
If ABORT : TRACK=159 : End If
'
Next TRACK
Return
'
End Proc
'**** Block edieren ****
Procedure _EDITBLOCK[BLOCK]
Erase 7
Reserve As Chip Data 7,1024
_TRACKBLOCK[BLOCK,2]
If ABORT Then Pop Proc
Screen Open 1,624,168,4,Hires
Screen To Back
Flash Off
Cls 0
Get Palette 0
Colour 3,$FFF
Screen Display 1,112,81,,
Pen 2 : Paper 0
Ink 2,0
Text 102,164,"ASC:" : Text 194,164,"HEX:"
Text 289,164,"POS: "+Hex$(0,8)
G[89,155,177,167,0] : G[181,155,269,167,0]
G[273,155,415,167,0]
G[419,155,507,167,0] : G[511,155,599,167,0]
Text 448,164,"Save" : Text 536,164,"Abort"
Locate 35,1 : Print "Block #";Str$(BLOCK)-" "+" & #"+Str$(BLOCK+1)-" "
Curs Off
For I=1 To 16
N$=""
For I2=1 To 64
N=Peek(Start(7)+I3)
If N<32 or(N>127 and N<161) Then N=46
N$=N$+Chr$(N)
Add I3,1
Next I2
Locate 11,2+I : Print N$
Next I
Curs Off
Clear Key
XC=11 : YC=3
Gosub _ASCHEXPOS
N=%11111111 : Set Curs N,0,0,0,0,0,0,N
Locate XC,YC : Curs On : Pen 1
Screen To Front
Do
Repeat
Clear Key
N=0
N2=0
While N=0 and N2=0 : N2=Mouse Key : N=Asc(Inkey$) : Wend
If N and N2=0
If N=28 and XC<74 : Inc XC : End If
If N=29 and XC>11 : Dec XC : End If
If N=30 and YC>3 : Dec YC : End If
If N=31 and YC<18 : Inc YC : End If
If N>31
N2=(YC-3)*64+(XC-11)
Print Chr$(N)
Curs Off
Poke Start(7)+N2,N
End If
Gosub _ASCHEXPOS
Locate XC,YC
Curs On
End If
Until Mouse Key>0
XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse)
If YM>154 and YM<168
If XM>87 and XM<178
G[89,155,177,167,1]
Gosub _TXTEINGABE
Gosub _ASCHEXPOS
G[89,155,177,167,0]
End If
If XM>418 and XM<508
G[419,155,507,167,1]
_TRACKBLOCK[BLOCK,3]
G[419,155,507,167,0]
End If
If XM>510 and XM<600
G[511,155,599,167,1]
Wait 20
Exit 1
End If
End If
Loop
Screen Close 1
Pop Proc
_ASCHEXPOS:
N$=""
Ink 2
N2=(YC-3)*64+(XC-11)
N=Peek(Start(7)+N2)
If N<10 : N$="00" : End If
If N<100 and N>9 : N$="0" : End If
N$=N$+Str$(N)-" "
Text 142,164,N$
Text 234,164,Hex$(N,2)
Text 329,164,Hex$(BLOCK*512+N2,8)
N=0
Return
_TXTEINGABE:
N$=""
Ink 0 : Bar 142,156 To 170,164
Ink 1
Repeat
N=0
Clear Key : Wait 10
While N=0 : N=Asc(Inkey$) : Wend
If N>47 and N<58 and Len(N$)<3
N$=N$+Chr$(N)
Text 142,164,N$
End If
Until N=13 or Len(N$)=3
N=Min(255,Val(N$))
N2=(YC-3)*64+(XC-11)
Poke Start(7)+N2,N
If N<31 or(N>127 and N<160)
N=46
End If
Print Chr$(N);
Locate XC,YC
Return
End Proc
'**** Zeige Trackdaten in Rawformat ****
Procedure _RAWSHOW[TRACK]
'
Reserve As Chip Data 2,$3A70
'
'**** Variablen & Adressen definieren ****
DISKREP$=Space$(40)+Chr$(0)
DEVNAME$="trackdisk.device"+Chr$(0)
DISKREP=Varptr(DISKREP$)
'
IOREQ$=Space$(80)+Chr$(0)
IOREQADR=Varptr(IOREQ$)
'
'**** Eigene Taskadresse suchen ****
Areg(0)=0
Areg(1)=0
Dreg(0)=0
Dreg(1)=0
XFINDTASK=Execall(-294)
Loke DISKREP+$10,XFINDTASK
'
'**** Device �ffnen ****
Areg(0)=Varptr(DEVNAME$)
Areg(1)=IOREQADR
Dreg(0)=TARGET
XOPENDEVICE=Execall(-444)
If XOPENDEVICE<>0 Then _MESSAGE["Targetdrive not available !"] : ABORT=True : Goto _BYE
'
'**** Befehl aufrufen ****
Loke IOREQADR+14,DISKREP
Loke IOREQADR+40,Start(2)
Loke IOREQADR+36,$397C
Doke IOREQADR+28,16
Poke IOREQADR+30,1
Areg(1)=IOREQADR
Loke IOREQADR+44,TRACK
XDOIO=Execall(-456)
If XDOIO=29 Then _MESSAGE["No disk in targetdrive !"] : ABORT=True
'
'**** Motor ausschalten I & II ****
Areg(1)=IOREQADR
Doke IOREQADR+28,9
Loke IOREQADR+36,0
XDOIO=Execall(-456)
'
'**** Device schlie�en I & II ****
Areg(1)=IOREQADR
XCLOSEDEVICE=Execall(-450)
'
If ABORT Then Goto _BYE
Gosub _RAWSHOW
'
Screen Close 1
'
_BYE:
Erase 2
Pop Proc
'
_RAWSHOW:
'
'**** Track in RAW Format zeigen ****
N=Start(2)
Screen Open 1,640,168,4,Hires
Flash Off : Cls 0 : Get Palette 0
Screen Display 1,128,81,,
Pen 2 : Paper 0 : I=0
Gosub _RAW
Do
UL=0 : Clear Key
Repeat : UL=Asc(Inkey$) : Until UL
If UL=28 or UL=31 Then Add I,1,0 To 10 : Gosub _RAW
If UL=29 or UL=30 Then Add I,-1,0 To 10 : Gosub _RAW
If UL=27 or UL=32 Then Exit
Loop
Return
_RAW:
Locate 0,1 : Cls 0 : Centre "Track:"+Str$(TRACK)+" Sector:"+Str$(I)
Locate 0,3 : Curs Off
For I2=0 To 1359
N2=Peek(N+I*1360+I2)
If N2<32 or N2>127 and N2<161 Then N2=46
Print Chr$(N2);
Next I2
Return
End Proc
'**** Directory ausgabe ****
Procedure _DIR
N$="DF"+Str$(TARGET)-" "+":"
If Exist(N$)
Screen Open 1,320,176,4,Lowres
Screen To Back
Screen Display 1,144,82,,
Flash Off
Get Palette 0
Cls 0
Dir$=N$
Pen 1 : Paper 0 : Print "Directory of ";Dir$
N$=Dir First$("")
Pen 2 : Print N$
Screen To Front
I=1
While N$<>""
Inc I
If I<20
N$=Dir Next$
Print N$
Else
Pen 1 : Print "press any key" : Curs Off : Wait Key
Pen 2
I=0
End If
Wend
Pen 1 : Print "press any key" : Curs Off : Wait Key
Screen Close 1
Else
_MESSAGE["No DOS disk in targetdrive !"]
End If
End Proc
'**** Vektoren nach Viren testen ****
Procedure _SYSCHECK
EXECBASE=4
EXECBASE=Leek(EXECBASE)
For I=0 To 4
Read N$,OFFSET
N=EXECBASE+OFFSET
N=Leek(N)
If N
Colour Back $F00 : Screen Show
Fade 1,$F00 : Wait 70
_MESSAGE[N$+" is abnormal: "+Hex$(N,8)]
Colour Back $779 : Screen Show
Fade 1,$779 : Wait 15
Pop Proc
End If
Next
_MESSAGE["No abnormal vector !"]
Data "ColdCapture",$2A
Data "CoolCapture",$2E
Data "WarmCapture",$32
Data "KickMemPtr",$222
Data "KickTagPtr",$226
End Proc
'**** Virus l�schen ****
Procedure _SYSRESET
For I=0 To 109 : Read N : N$=N$+Chr$(N) : Next I
Call Varptr(N$)
Data 51,252,64,0,0,223,240,154,44,120
Data 0,4,32,86,145,252,0,0,2,118
Data 48,60,33,0,66,152,81,200,255,252
Data 32,124,0,0,0,0,48,60,0,254
Data 66,152,81,200,255,252,61,124,170,170
Data 0,36,45,124,204,204,204,204,0,38
Data 45,124,0,48,0,0,0,62,45,124
Data 0,222,0,0,0,78,45,124,187,187
Data 187,187,0,82,45,124,221,221,221,221
Data 2,42,32,124,1,0,0,0,34,124
Data 0,255,255,236,36,81,145,202,78,208
End Proc
'**** Datenklau ( Illegal ) ****
Procedure _RIPPER
'
On Error Goto FEHLER
'
Do
'
Erase 8
_MESSAGE[""]
Put Block 1,49,190
E=0 : TASTE=0
Wait 60 : Clear Key
While Mouse Key<>0 : Wend
While Mouse Key=0 and TASTE=0 : TASTE=Asc(Inkey$) : Wend
X=X Screen(X Mouse) : Y=Y Screen(Y Mouse)
If TASTE : X=0 : Y=0 : End If
If Y>189 and Y<199 or TASTE
'
If X>48 and X<90 or TASTE=49
G[49,190,89,197,1] : Wait 20
_MESSAGE[""]
_MESSAGE["Enter string:"]
_TEXTINPUT[15]
If RIP$="" : Goto _FEHLER : End If
_MESSAGE[""]
N$=RIP$
_MESSAGE["Enter startblock:"]
_TEXTINPUT[19]
_MESSAGE[""]
N=Val(RIP$)
N=Abs(N)
N=Min(1759,N)
_MESSAGE["Searching in block #"+Str$(N)-" "]
For I=N To 1759
Text 175,196,Str$(I)-" "
_TRACKBLOCK[I,2]
F=Hunt(Start(7) To Start(7)+512,N$)
If F : N=I : I=1759 : End If
If Inkey$<>"" : I=1759 : End If
Next I
_MESSAGE[""]
If F
Add F,-Start(7)
_MESSAGE["String in block #"+Str$(N)-" "+" POS:"+Hex$(N*512+F,8)]
Else
_MESSAGE["String not found !"]
End If
End If
'
If X>91 and X<160 or TASTE=50
G[92,190,159,197,1] : Wait 20
_MESSAGE[""]
_MESSAGE["Enter startblock:"]
_TEXTINPUT[19]
A=Val(RIP$)
A=Abs(A)
A=Min(1759,A)
_MESSAGE[""]
_MESSAGE["Enter endblock:"]
_TEXTINPUT[17]
B=Val(RIP$)
B=Abs(B)
B=Min(1759,B)
If A>B : Swap A,B : End If
'
Gosub _TESTDRIVE
If E : Goto _FEHLER : End If
N$=Fsel$("","","Choose outputfile !")
'
If N$<>""
Open Out 1,N$
If E : Goto _FEHLER : End If
_MESSAGE["Working block #"+Str$(A)-" "]
For I=A To B
Text 134,196,Str$(I)-" "
_TRACKBLOCK[I,2]
For I2=0 To 511
A$=A$+Chr$(Peek(Start(7)+I2))
Next I2
Print #1,A$;
A$=""
Next I
Close 1
_MESSAGE[""]
_MESSAGE["Proccess finished !"]
Else
Goto _FEHLER
End If
End If
'
If X>161 and X<201 or TASTE=51
G[162,190,200,197,1] : Wait 20
_MESSAGE[""]
_MESSAGE["Enter string:"]
_TEXTINPUT[15]
If RIP$="" : Goto _FEHLER : End If
'
Gosub _TESTDRIVE
If E : Goto _FEHLER : End If
N$=Fsel$("","","Choose file for left cut !")
'
If N$<>""
If Exist(N$)
Open In 1,N$
N=Lof(1)
Close 1
Reserve As Data 8,N
Bload N$,Start(8)
F=Hunt(Start(8) To Start(8)+Length(8),RIP$)
If F
N$=Fsel$("","","Choose outputfile !")
If N$<>""
Bsave N$,Start(8)+(F-Start(8)) To Start(8)+Length(8)
If E=0 : Goto _FEHLER : End If
End If
Else
_MESSAGE["String not found !"]
End If
Else
_MESSAGE["File not found !"]
End If
Else
Goto _FEHLER
End If
End If
'
If X>202 and X<244 or TASTE=52
G[203,190,243,197,1] : Wait 20
_MESSAGE[""]
_MESSAGE["Enter string:"]
_TEXTINPUT[15]
If RIP$="" : Goto _FEHLER : End If
'
Gosub _TESTDRIVE
If E : Goto _FEHLER : End If
N$=Fsel$("","","Choose file for right cut !")
'
If N$<>""
If Exist(N$)
Open In 1,N$
N=Lof(1)
Close 1
Reserve As Data 8,N
Bload N$,Start(8)
I=Start(8)
Repeat
F=Hunt(I+1 To Start(8)+Length(8)+1,RIP$)
If F
I=F
End If
Until F=0
If I and I<>Start(8)
N$=Fsel$("","","Choose outputfile !")
If N$<>""
Bsave N$,Start(8) To I
If E=0 : Goto _FEHLER : End If
End If
Else
_MESSAGE["String not found !"]
End If
Else
_MESSAGE["File not found !"]
End If
Else
Goto _FEHLER
End If
End If
'
If X>245 and X<272 or TASTE=53
G[246,190,271,197,1] : Wait 20
_MESSAGE[""]
Pop Proc
End If
End If
Clear Key
While Mouse Key=0 and Asc(Inkey$)=0 : Wend
_FEHLER:
'
Loop
'
FEHLER:
E=Errn
_MESSAGE["Error #"+Str$(E)-" "+" occured !"]
Clear Key
While Mouse Key=0 and Asc(Inkey$)=0 : Wend
Resume Next
'
_TESTDRIVE:
_MESSAGE[""]
If Exist("DF0:") Then Dir$="DF0:" : Return
If Exist("DF1:") Then Dir$="DF1:" : Return
If Exist("DF2:") Then Dir$="DF2:" : Return
If Exist("DF3:") Then Dir$="DF3:" : Return
If Exist("RAM:") Then Dir$="RAM:" : Return
_MESSAGE[""]
_MESSAGE["No DOS disk available !"]
E=True
Clear Key
While Mouse Key=0 and Asc(Inkey$)=0 : Wend
Return
'
End Proc
'**** Texteingabe ****
Procedure _TEXTINPUT[N]
Shared N$
N$=""
Do
Clear Key
N2=0
While N2=0 : N2=Asc(Inkey$) : Wend
Exit If N2=13
If N2<>8 and Len(N$)+N<37
N$=N$+Chr$(N2)
End If
If N2=8
If Len(N$)>0
N$=Left$(N$,Len(N$)-1)
End If
End If
Text N*8,196,N$+" "
Loop
RIP$=N$
End Proc
'**** Trackanzeige ****
Procedure _RASTER[TRACK,XDOIO]
N=TRACK mod 2
If XDOIO
Ink 2
Add XDOIO,-19
If XDOIO>8
If XDOIO=9 : N$="Disk is write protected !" : End If
If XDOIO=10 : N$="No disk in drive !" : End If
_MESSAGE[N$]
ABORT=True
Pop Proc
End If
End If
If N=0
Text 84+XUPP*10,66+YUPP*11,Str$(XDOIO)-" "
Else
Text 202+XLOW*10,66+YLOW*11,Str$(XDOIO)-" "
End If
End Proc
Procedure _VERIFY[TRACK,XDOIO]
If XDOIO=0 Then Pop Proc
N=TRACK mod 2
Add XDOIO,-19
_MESSAGE["Verify error ! � ESC=Abort process �"]
If N=0
Text 84+XUPP*10,66+YUPP*11,Str$(XDOIO)-" "
Else
Text 202+XLOW*10,66+YLOW*11,Str$(XDOIO)-" "
End If
Repeat : N2=Asc(Inkey$) : Until N2
_MESSAGE[""]
If N2=27 Then ABORT=True
End Proc
Procedure _LESETEST[TRACK,XDOIO]
If XDOIO=0 Then Pop Proc
If XDOIO=29 : _RASTER[TRACK,29] : Pop Proc : End If
N=TRACK mod 2
Add XDOIO,-19
Ink 2
If N=0
Text 84+XUPP*10,66+YUPP*11,Str$(XDOIO)-" "
Else
Text 202+XLOW*10,66+YLOW*11,Str$(XDOIO)-" "
End If
_MESSAGE["Read error ! � ESC=Abort process �"]
Repeat : N2=Asc(Inkey$) : Until N2
_MESSAGE[""]
If N2=27 Then ABORT=True
End Proc
'**** Testen ob Track selektiert ****
Procedure _BAMCHECK[UL]
If UL=0
Add XUPP,1
If XUPP=10
Add YUPP,1 : XUPP=0
End If
If UPP(UPP) and UPPSIDE : _DOIT=True Else _DOIT=False : End If
Inc UPP
Else
If LOW(LOW) and LOWSIDE : _DOIT=True Else _DOIT=False : End If
Inc LOW
Add XLOW,1
If XLOW=10
Add YLOW,1 : XLOW=0
End If
End If
End Proc
'**** Prozess vorzeitig beenden ****
Procedure _ABORT
XM=X Screen(X Mouse)
YM=Y Screen(Y Mouse)
If XM>40 and XM<72 and YM>134 and YM<146
G[41,135,71,145,1]
ABORT=True
Wait 5
G[41,135,71,145,0]
_MESSAGE["Process aborted !"]
End If
End Proc
'**** Mitteilung ****
Procedure _MESSAGE[N$]
Ink 0,0 : Bar 12,189 To 301,198
Ink 2 : Text 14,196,N$
End Proc
'**** Schalter An / Aus ****
Procedure G[X,Y,X2,Y2,S]
If S Then C1=2 : C2=1 Else C1=1 : C2=2
Ink C1 : Draw X,Y To X2-1,Y : Draw X,Y To X,Y2 : Ink C2 : Draw X+1,Y2 To X2,Y2 : Draw X2,Y To X2,Y2 : Ink 1,0
End Proc